#include "Terrain.h"



void terInit(Terrain * pTer, Terrain * pTersuiv)
{
    char chemin[18];
    chargerTerrain(pTer, "data/NiveauDépart.txt",LARGEUR_FENETRE,HAUTEUR_FENETRE);
    chargerTerrain(pTersuiv, selectTerrain(chemin),LARGEUR_FENETRE,HAUTEUR_FENETRE);
}



void chargerTileset(FILE* F,Terrain * pTer)
{
	int numtile,i,j;
	char buf[CACHE_SIZE];  /* un buffer petite mémoire cache*/
	char buf2[CACHE_SIZE];  /* un buffer petite mémoire cache*/
	fscanf(F,"%s",buf); /* nom du fichier*/
	fscanf(F,"%d %d",&pTer->nbtilesX,&pTer->nbtilesY);/* charge le nombre de tiles en largeur et longueur*/
	pTer->tileplein = malloc(pTer->nbtilesX*pTer->nbtilesY*sizeof(int));/*alloue la mémoire pour chaque tile et rentre s il est plein*/
	for(j=0,numtile=0;j<pTer->nbtilesY;j++)
	{
		for(i=0;i<pTer->nbtilesX;i++,numtile++)
		{
			fscanf(F,"%s %s",buf,buf2);
			pTer->tileplein[numtile] = 0;
			if (strcmp(buf2,"plein")==0 || strcmp(buf2,"bord")==0)
				pTer->tileplein[numtile] = 1;/* pour chaques tiles regarde si c'est plein*/
		}
	}
}



void chargerNiveau(FILE* F,Terrain * pTer)
{
	int i,j;
	fscanf(F,"%d %d",&pTer->nbtiles_largeur_monde,&pTer->nbtiles_hauteur_monde);/* prend la taille de la map*/
	pTer->schema = malloc(pTer->nbtiles_largeur_monde*sizeof(char*));
	for(i=0;i<pTer->nbtiles_largeur_monde;i++)
		pTer->schema[i] = malloc(pTer->nbtiles_hauteur_monde*sizeof(char*));/* pour chaque ligne de la map alloue la mémoire pour une colonne*/
	for(j=0;j<pTer->nbtiles_hauteur_monde;j++)
	{
		for(i=0;i<pTer->nbtiles_largeur_monde;i++)
		{
			int tmp;
			fscanf(F,"%d",&tmp);
			if (tmp>=pTer->nbtilesX*pTer->nbtilesY)
				printf("level tile hors limite\n");/*teste si on sort du tileset*/

                pTer->schema[i][j] = tmp;/* charge tout les chiffres qui composent la map*/
		}
	}
}



void chargerTerrain(Terrain * pTer, const char* level,int largeur_fenetre,int hauteur_fenetre)
{
	FILE* F;
	char buf[CACHE_SIZE];
	F = fopen(level,"r"); /* ouvre le niveau choisit avec const char level*/
	if (!F)
		printf("fichier level introuvable\n");/* le niveau n'existe pas*/
	fgets(buf,CACHE_SIZE,F);

	do
	{
		fscanf(F,"%s",buf);
		if (strstr(buf,"#tileset"))
			chargerTileset(F,pTer);
		if (strstr(buf,"#level"))
			chargerNiveau(F,pTer);
	} while (strstr(buf,"#fin")==NULL);
	pTer->largeur_fenetre = largeur_fenetre;
	pTer->hauteur_fenetre = hauteur_fenetre;
	pTer->xscroll = 0;
	pTer->focusSprite = NULL;
	fclose(F);

}


Sprite* FocusScrollBox(Terrain* pTer, Sprite* pSprite, int x, int y, int w, int h)
{
	pTer->focusx = x;
	pTer->focusy = y;
	pTer->focusw = w;
	pTer->focush = h;
	return pSprite;/* focalise la fenetre sur l'avancée du personnage*/
}


const char terGetXY(const Terrain *pTer, int x, int y)
{
	assert( x>=0) ;
	assert( y>=0) ;
	assert( x<pTer->nbtiles_largeur_monde ) ;
	assert( y<pTer->nbtiles_hauteur_monde ) ;
	return pTer->schema[y][x];
}

void terSetXY(Terrain * pTer, int x, int y, char valeur)
{
	assert( x>=0) ;
	assert( y>=0) ;
	assert( x<pTer->nbtiles_largeur_monde ) ;
	assert( y<pTer->nbtiles_hauteur_monde ) ;
	pTer->schema[y][x] = valeur;
}

const int getDimX(const Terrain * pTer)
{
	return pTer->nbtiles_largeur_monde;
}

const int getDimY(const Terrain * pTer)
{
	return pTer->nbtiles_hauteur_monde;
}

const char * selectTerrain(char chemin[])
{
    int numniv;
    srand(time(NULL));
    numniv=(rand()% 12 )+ 1;
    sprintf(chemin,"data/Niveau%d.txt",numniv);
    return chemin;
}

int verifProchCase(const Terrain *pTer, float x, float y)
{
	if (x>=0 && x<pTer->nbtiles_largeur_monde && y>=0 && y<pTer->nbtiles_hauteur_monde && pTer->schema[(int)y][(int)x]!='#')
		return 1;

    return 0;
}



void CopieProchCarte(Terrain* pTer, Terrain * pTersuiv)
{
	int i,j;
	int minx,maxx,miny,maxy;
    minx = pTer->xscroll / pTer->LARGEUR_TILE-1;
	miny = -1;
	maxx = (minx%(pTer->nbtiles_largeur_monde));
	maxy = pTer->hauteur_fenetre/pTer->HAUTEUR_TILE;
	for(i=0;i<=maxx;i++)
	{
		for(j=miny;j<=maxy;j++)
		{
				pTer->schema[i%pTer->nbtiles_largeur_monde][j]=pTersuiv->schema[i%pTersuiv->nbtiles_largeur_monde][j];
		}
	}
}

int libereTerrain(Terrain* pTer)
{
	int i;
	for(i=0;i<pTer->nbtiles_largeur_monde;i++)
		free(pTer->schema[i]);
	free(pTer->schema);
	free(pTer->tileplein);
	return 0; /* libere la map à l'aide de la fonction free*/
}



